/**
 * MobX环境设置助手
 * 在应用启动时进行MobX相关的初始化配置
 */

// 优先加载MobX polyfill - 确保process对象在任何模块加载前存在
require('../../helpers/mobx_polyfill');

// 尝试加载补丁版本的MobX，如果失败则回退到原始版本
let mobx, mobxMiniprogram;

try {
  // 尝试加载补丁版本
  mobx = require('../../miniprogram_npm/mobx/patched.js');
  console.info('[MobX Setup] 已加载MobX补丁版本');
} catch (e) {
  console.warn('[MobX Setup] 加载补丁版本失败，使用原始版本:', e.message);
  try {
    mobx = require('../../miniprogram_npm/mobx/index.js');
  } catch (e) {
    console.error('[MobX Setup] MobX加载失败:', e);
    throw new Error('无法加载MobX库，请检查依赖');
  }
}

try {
  // 尝试加载补丁版本
  mobxMiniprogram = require('../../miniprogram_npm/mobx-miniprogram/patched.js');
  console.info('[MobX Setup] 已加载mobx-miniprogram补丁版本');
} catch (e) {
  console.warn('[MobX Setup] 加载补丁版本失败，使用原始版本:', e.message);
  try {
    mobxMiniprogram = require('../../miniprogram_npm/mobx-miniprogram/index.js');
  } catch (e) {
    console.error('[MobX Setup] mobx-miniprogram加载失败:', e);
    throw new Error('无法加载mobx-miniprogram库，请检查依赖');
  }
}

/**
 * 设置MobX环境
 * 配置全局MobX设置，如严格模式、异常处理等
 */
function setupMobXEnvironment() {
  // 再次确保process对象存在，以防此函数被直接调用
  const polyfill = require('../../helpers/mobx_polyfill');
  
  try {
    // 配置MobX
    mobx.configure({
      enforceActions: 'observed', // 强制actions
      computedRequiresReaction: true, // 计算属性需要reaction才能执行
      reactionRequiresObservable: true, // reaction需要至少一个observable
      disableErrorBoundaries: false // 不禁用错误边界
    });

    console.info('[MobX] 环境初始化完成，运行模式:', process.env.NODE_ENV);
  } catch (error) {
    console.error('[MobX] 配置失败:', error);
    // 如果配置失败，尝试直接设置全局对象
    if (typeof global.process === 'undefined') {
      global.process = { env: { NODE_ENV: 'production' } };
    } else if (typeof global.process.env === 'undefined') {
      global.process.env = { NODE_ENV: 'production' };
    }
    
    console.warn('[MobX] 已设置默认环境:', process.env.NODE_ENV);
  }
}

module.exports = {
  setupMobXEnvironment,
  // 导出一些有用的MobX函数
  observable: mobxMiniprogram.observable,
  action: mobxMiniprogram.action,
  computed: mobxMiniprogram.computed,
  configure: mobx.configure,
  runInAction: mobx.runInAction,
  autorun: mobx.autorun,
  reaction: mobx.reaction
};

// 导出MobX辅助函数
export const getMobxVersion = () => {
  try {
    return mobxMiniprogram.version || '未知';
  } catch (error) {
    console.error('[MobX] 获取版本失败', error);
    return '加载失败';
  }
};

// 用于检查Store状态的辅助函数
export const debugMobxStore = (store, storeName = '未命名Store') => {
  try {
    if (typeof process !== 'undefined' && 
        typeof process.env !== 'undefined' && 
        process.env.NODE_ENV !== 'production') {
      console.group(`[Store调试] ${storeName}`);
      console.log('可观察状态:', store);
      console.groupEnd();
    }
  } catch (error) {
    console.error('[MobX] 调试状态失败:', error);
  }
}; 